/***************************************************
 @Name :        小铭同学
 @Time :        2025-09-03
 @Email :       LiaoMingWJ233@163.com
 @Comment :     智能 AI 对话
 @FileName :    widget.cpp
 @Version :     1.0
****************************************************/


#include "widget.h"
#include "ui_widget.h"
#include <QScrollBar>
#include <QTimer>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QResizeEvent>
#include <QFontMetrics>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , m_scrollArea(nullptr)
    , m_contentWidget(nullptr)
    , m_mainLayout(nullptr)
{
    ui->setupUi(this); 
    
    tcp = new TCP;
    tcp->startServer();
    
    // 客户端发送消息给服务端
    connect(tcp, &TCP::dataReceived, this, [=](const QString &data){
        qDebug() << data << "接收到信息";
        
        QPixmap aiAvatar(":/头像2"); // AI头像
        if (aiAvatar.isNull()) {
            aiAvatar = QPixmap(50, 50);
            aiAvatar.fill(Qt::blue);
        }
        
        addMessage(MessageType_Left, "小谭", data+" ", aiAvatar);   
        });
    
    
    /*deepseek = new Deepseek_Chat(this);               
    connect(deepseek , &Deepseek_Chat::replyReady , this, [&](const QString &reply){
        qDebug() << reply << "接收到信息";
        
        QPixmap aiAvatar(":/头像2"); // AI头像
        if (aiAvatar.isNull()) {
            aiAvatar = QPixmap(50, 50);
            aiAvatar.fill(Qt::blue);
        }
        
        addMessage(MessageType_Left, "小谭", reply+" ", aiAvatar);        
    });
    
    connect(deepseek , &Deepseek_Chat::error_signals , this,[&](const QString &reply){
        qDebug() << reply << "接收到错误";
    });*/
    
    ui->exit->raise();
    PushButton_Tcp(ui->exit);
    
    ui->label_bj->setPixmap(QPixmap(":/主题背景"));
    
    ui->label_deepseek->setPixmap(QPixmap(":/deepseek"));
    
    ui->label_zt->setText("智能 AI");
    ui->label_zt->setStyleSheet("QLabel {"
        "    font-size: 50px;"           // 字体大小
        "    color: #1837ae;"            // 文字颜色
        "    font-weight: bold;"         // 字体粗细
        "    font-family: '楷体';"        // 字体家族
        "}"
    );
    
    // 创建输入法实例
    pinyinInput = new SyszuxPinyin();
    
    // 连接信号槽，接收输入的文本
    connect(pinyinInput, &SyszuxPinyin::sendPinyin, this, [this](QString text) {
        qDebug() << "接收到输入:" << text;
        ui->textEdit->insertPlainText(text); // 将输入法内容插入文本编辑框
    });
    
    // 初始化聊天界面
    initChatUI();
    
    // 设置发送按钮样式
    PushButton_Tcp(ui->send);
    
    // 连接发送按钮信号槽
    connect(ui->send, &QPushButton::clicked, this, &Widget::on_sendButton_clicked);
    
}

Widget::~Widget()
{
    delete ui;
    delete pinyinInput;
}

// 初始化聊天界面
void Widget::initChatUI()
{
    // 使用UI中已有的scrollArea控件
    m_scrollArea = ui->scrollArea; // 直接使用UI中的scrollArea
    
    // 设置滚动区域样式 - 彻底透明版本
    m_scrollArea->setStyleSheet(R"(
        QScrollArea {
            background: transparent;
            border: none;
        }
        QScrollArea > QWidget > QWidget {
            background: transparent;
        }
        QScrollArea > QWidget > QScrollBar:vertical {
            background: transparent;
            width: 10px;
        }
        QScrollArea > QWidget > QScrollBar::handle:vertical {
            background: rgba(192, 192, 192, 150);
            min-height: 20px;
            border-radius: 5px;
        }
        QScrollArea > QWidget > QScrollBar::add-line:vertical, 
        QScrollArea > QWidget > QScrollBar::sub-line:vertical {
            background: transparent;
            height: 0px;
        }
    )");       
    
    // 创建内容部件
    m_contentWidget = new QWidget();
    m_mainLayout = new QVBoxLayout(m_contentWidget);
    m_mainLayout->setAlignment(Qt::AlignTop);
    m_mainLayout->setSpacing(10); // 设置消息间距
    m_mainLayout->setContentsMargins(10, 10, 10, 10);
    
    m_scrollArea->setWidget(m_contentWidget);
    
    // 同时设置视口(viewport)的样式
    m_scrollArea->viewport()->setStyleSheet("background: transparent; border: none;");
    // 设置内容部件的样式
    m_contentWidget->setStyleSheet("background: transparent;");
    
    // 添加一些示例消息
    QPixmap defaultAvatar(":/头像2"); // 请确保有默认头像资源
    if (defaultAvatar.isNull()) {
        defaultAvatar = QPixmap(50, 50);
        defaultAvatar.fill(QColor(24, 55, 174)); // 使用主题色
    }
    
    addMessage(MessageType_Left, "小谭", "您好！我是智能助手，有什么可以帮您的吗？", defaultAvatar);
}

// 添加消息
void Widget::addMessage(MessageType type, const QString &nickname, const QString &content, const QPixmap &avatar)
{
    // 创建消息容器
    QWidget *messageWidget = new QWidget(m_contentWidget);
    QHBoxLayout *messageLayout = new QHBoxLayout(messageWidget);
    messageLayout->setContentsMargins(10, 5, 10, 5);
    messageLayout->setSpacing(10);
    
    // 创建头像标签
    QLabel *avatarLabel = new QLabel(messageWidget);
    avatarLabel->setFixedSize(40, 40);
    avatarLabel->setScaledContents(true);
    avatarLabel->setPixmap(avatar.scaled(40, 40, Qt::KeepAspectRatio, Qt::SmoothTransformation));
    avatarLabel->setStyleSheet("border-radius: 20px;");
    
    // 创建右侧内容区域
    QWidget *contentWidget = new QWidget(messageWidget);
    QVBoxLayout *contentLayout = new QVBoxLayout(contentWidget);
    contentLayout->setContentsMargins(0, 0, 0, 0);
    contentLayout->setSpacing(2);
    
    // 创建昵称标签
    QLabel *nicknameLabel = new QLabel(contentWidget);
    nicknameLabel->setText(nickname);
    
    // 设置昵称字体样式 - 楷体18号
    QFont nicknameFont;
    nicknameFont.setFamily("楷体");      // 字体家族：楷体
    nicknameFont.setPointSize(15);      // 字体大小：15号
    nicknameFont.setWeight(QFont::Bold); // 字体粗细：粗体
    nicknameLabel->setFont(nicknameFont);
    
    // 创建内容标签
    QLabel *contentLabel = new QLabel(contentWidget);
    contentLabel->setText(content);
    contentLabel->setWordWrap(true);
    contentLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
    contentLabel->setMaximumWidth(300);
    
    // 允许标签根据内容调整大小
    contentLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
    contentLabel->setMinimumWidth(50); // 最小宽度
    contentLabel->setMaximumWidth(400); // 最大宽度，避免过宽
    
    // 设置内容字体样式 - 楷体18号
    QFont contentFont;
    contentFont.setFamily("楷体");       // 字体家族：楷体
    contentFont.setPointSize(15);       // 字体大小：15号
    contentFont.setWeight(QFont::Normal); // 字体粗细：正常
    contentLabel->setFont(contentFont);
    
    // 设置消息样式
    QString bubbleStyle;
    QString nicknameStyle;
    
    // 在设置消息样式部分可以这样调整：
    if (type == MessageType_Left) {
        // 左侧：兰紫色文字，浅紫色背景
        bubbleStyle = "background-color: #F0E6FF; padding: 12px 16px; border-radius: 12px; color: #8A2BE2;"; 
        nicknameStyle = "color: #8A2BE2;";
        nicknameLabel->setAlignment(Qt::AlignLeft);
    } else {
        // 右侧：粉紫色文字，浅粉色背景
        bubbleStyle = "background-color: #a0e9fe; padding: 12px 16px; border-radius: 12px; color: #b22222;";
        nicknameStyle = "color: #b22222;";
        nicknameLabel->setAlignment(Qt::AlignRight);
    }
    
    // 应用样式
    nicknameLabel->setStyleSheet(nicknameStyle);
    contentLabel->setStyleSheet(bubbleStyle);
    
    // 添加到布局
    contentLayout->addWidget(nicknameLabel);
    contentLayout->addWidget(contentLabel);
    
    // 根据消息类型设置布局顺序
    if (type == MessageType_Left) {
        messageLayout->addWidget(avatarLabel);
        messageLayout->addWidget(contentWidget);
        messageLayout->setAlignment(avatarLabel, Qt::AlignTop);
    } else {
        messageLayout->addWidget(contentWidget);
        messageLayout->addWidget(avatarLabel);
        messageLayout->setAlignment(avatarLabel, Qt::AlignTop);
        contentLayout->setAlignment(Qt::AlignRight);
    }
    
    // 计算并设置合适的高度
    QTimer::singleShot(100, [contentLabel, messageWidget]() {
        // 计算文本需要的高度
        QFontMetrics metrics(contentLabel->font());
        int textWidth = contentLabel->width() - 32; // 减去padding
        QRect textRect = metrics.boundingRect(0, 0, textWidth, 0, 
                                              Qt::TextWordWrap, contentLabel->text());
        
        // 设置内容标签的最小高度
        contentLabel->setMinimumHeight(textRect.height() + 24); // 加上padding
        
        // 确保消息容器能够适应内容
        messageWidget->adjustSize();
    });
        
    // 添加到主布局
    m_mainLayout->addWidget(messageWidget);
    
    // 滚动到底部
    scrollToBottom();
}

// 滚动到底部
void Widget::scrollToBottom()
{
    QTimer::singleShot(100, [this]() {
        if (m_scrollArea && m_scrollArea->verticalScrollBar()) {
            m_scrollArea->verticalScrollBar()->setValue(
                m_scrollArea->verticalScrollBar()->maximum()
            );
        }
    });
}

// 清空聊天记录
void Widget::clearChat()
{
    QLayoutItem *child;
    while ((child = m_mainLayout->takeAt(0)) != nullptr) {
        if (child->widget()) {
            delete child->widget();
        }
        delete child;
    }
}

// textEdit失去焦点时隐藏输入法
void Widget::on_textEdit_focusOut()
{
    pinyinInput->hide();
}

void Widget::PushButton_Tcp(QPushButton* PushButton)
{
    PushButton->setStyleSheet(R"(
        QPushButton {
            background-color: #4285f4;
            color: white;
            border-radius: 15px;
            border: none;
            padding: 4px 4px;
            font-size: 20px;
            font-weight: bold;
            font-family: "楷体";
        }
        QPushButton:hover {
            background-color: #3367d6;
        }
        QPushButton:pressed {
            background-color: #2a56c6;
        }
    )");
}

void Widget::on_exit_clicked()
{
    this->close();
    QApplication::quit();
}

// 在textEdit的焦点事件中处理
void Widget::on_textEdit_selectionChanged()
{
    pinyinInput->show(); // 显示输入法
}

// 发送按钮点击事件
void Widget::on_sendButton_clicked()
{
    QString message = ui->textEdit->toPlainText().trimmed();
    if (message.isEmpty()) {
        return;
    }
    
    // 添加用户消息（右侧）
    QPixmap userAvatar(":/头像1"); // 用户头像
    if (userAvatar.isNull()) {
        userAvatar = QPixmap(50, 50);
        userAvatar.fill(Qt::green);
    }
    
    tcp->onSendButtonClicked(message);  // 发送消息给客户端
    
    // 发送请求 AI
    //deepseek->ask(ui->textEdit->toPlainText());
    
    addMessage(MessageType_Right, "罗峰", message, userAvatar);
    
    // 清空输入框
    ui->textEdit->clear();       
}
